package com.company.common.function.swagger.config;


import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Contact;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

//swagger  配置  描述信息 接口扫描 接口过滤  忽略接口参数  控制环境  Api分组  实体信息（主要看model类和Controller）  配置全局参数

/**
 * #### 搭建工程配置swagger
 * #### swagger描述信息的配置
 * #### 配置接口扫描策略
 * #### 接口配置过滤
 * #### 配置接口忽略参数
 * #### 控制swagger在那种环境下展示
 * #### 为api配置分组
 * #### 实体信息配置
 * ### 配置全局参数
 * #### 接口和参数配置
 * #### NumberberFotmatException异常解决
 */
@Configuration
@EnableSwagger2
public class SwaggerController {
    //swagger2的配置文件，这里可以配置swagger2的一些基本的内容，比如扫描的包等等
    @Bean
    public Docket createRestApi() {
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                //为当前包路径
                .apis(RequestHandlerSelectors.basePackage("com.example.swagger.controller"))
                .paths(PathSelectors.any())
                .build();
    }

    //构建 api文档的详细信息函数,注意这里的注解引用的是哪个
    private ApiInfo apiInfo() {
        return new ApiInfoBuilder()
                //页面标题
                .title("Spring Boot 测试使用 Swagger2 构建RESTful API")
                //创建人
                .contact(new Contact("WangXiaodong", "http://www.baidu.com", ""))
                //版本号
                .version("1.0")
                //描述
                .description("API 描述")
                .build();
    }


    //配置全局参数用户访问浏览器登录，后端传给前段一个token请求头参数就是全局参数
//    @Bean
//    public Docket docketUser(){
//        //构建  token全局参数
//        Parameter token = new ParameterBuilder().name("token")
//                .description("用户登录令牌")  //备注
////                .parameterType("header")
//                //(@RequestHeader("token")String token)  接收头token 参数
//                .parameterType("query")
//                //(String token)  接收 query token 参数
//                .modelRef(new ModelRef("String"))
//                .required(true)   //每一个接口都带token
//                .build();
//        List<Parameter> parameters = new ArrayList<>();
//        parameters.add(token);
//        return new Docket(DocumentationType.SWAGGER_2)
//                .globalOperationParameters(parameters);
//    }


    //实体信息（主要看model类和Controller）
//    @Bean
//    public Docket docketUser(){
//        return new Docket(DocumentationType.SWAGGER_2);
//    }


    //Api分组  （不同的controller不同的组）
//        @Bean
//    public Docket docketUser(){
//        return new Docket(DocumentationType.SWAGGER_2)
//                .groupName("用户")
//                .select().paths(PathSelectors.ant("/user"))//扫描特定接口（过滤）
//                .build()
//                ;
//    }
//    @Bean
//    public Docket docketHello(){
//        return new Docket(DocumentationType.SWAGGER_2)
//                .groupName("你好")
//                .select().paths(PathSelectors.ant("/hello"))//扫描特定接口
//                .build()
//                ;
//    }


    //忽略请求的参数    访问环境控制
//    @Autowired
//    Environment environment;
//        @Bean
//    public Docket docket(){
//            //通过swagger控制在不同环境（开发develop，测试test，生产（上线）production）下的访问权限展示效果
//            Profiles profiles = Profiles.of("dev", "test");    //授权设置访问环境
////            Profiles profiles = Profiles.of("prod");    //相反返回  !isEnable
//            boolean isEnable = environment.acceptsProfiles(profiles);  //通过yml适配，若在设置访问环境内，返回Boolean值 传enable
//
//            return new Docket(DocumentationType.SWAGGER_2)
//                //配置要忽略的请求参数(主要用于springMVC)
//                .ignoredParameterTypes(Integer.class,Long.class, HttpServletRequest.class)  //对应HelloController的Delete
////                .enable(true); //默认可以访问
//                  .enable(isEnable)
////                  .enable(!isEnable)
//                ;
//    }


    //选择接口（扫描）（过滤）
//    @Bean
//    public Docket docket(){
//        return new Docket(DocumentationType.SWAGGER_2)
//                .select()  //扫描  不同类，方法，路径，及全部或全部不
////                .apis(RequestHandlerSelectors.withMethodAnnotation(GetMapping.class))
////                .apis(RequestHandlerSelectors.withClassAnnotation(RestController.class))
////                .apis(RequestHandlerSelectors.none())
////                Api接口文档没有映射的接口      .any() 默认配置 都会扫描 所有的接口都显示
////                                             .withClassAnnotation() 基于类上的注解来扫描
//                .apis(RequestHandlerSelectors.basePackage("com.example.swagger.controller"))
//                //通过路径扫描controller下的特定接口 如："/user" （过滤）
//                .paths(PathSelectors.ant("/hello"))
//                .build()
//                ;
//    }


    //信息模块
    //docket保存api信息,返回（生成）实例
//    @Bean
//    public Docket docket(){
//        return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo());
//    }
//    public ApiInfo apiInfo(){
//        Contact contact = new Contact("张三", "aaa.com", "123qq.com");
//        return  new ApiInfo("swagger学习接口文档",
//                "这是学习swagger时生成的文档信息",
//                "v1.0",
//                "http:localhost:8080",
//                contact,  //构建类   传入实例
//                "",
//                "",
//                new ArrayList<>()
//                );
//    }
}
